package br.com.sadim.web;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;

import javax.faces.model.SelectItem;

import org.hibernate.Query;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.ChartSeries;
import org.primefaces.model.chart.LineChartSeries;
import org.primefaces.model.chart.PieChartModel;

import com.sun.xml.internal.bind.v2.TODO;

import br.com.sadim.diagnostico.Doenca;
import br.com.sadim.diagnostico.DoencaRN;
import br.com.sadim.hospital.Consulta;
import br.com.sadim.hospital.ConsultaRN;
import br.com.sadim.hospital.DadoRelatorio;
import br.com.sadim.hospital.DiagnosticoConsulta;
import br.com.sadim.hospital.StatusConsulta;
import br.com.sadim.hospital.TipoUsuario;
import br.com.sadim.hospital.Usuario;
import br.com.sadim.hospital.UsuarioRN;
import br.com.sadim.paciente.Paciente;
import br.com.sadim.paciente.SexoPaciente;

public class RelatorioEsperaBean {
	private PacienteBean pacienteBean = new PacienteBean();
	private ConsultaBean consultaBean = new ConsultaBean();
	private ConsultaRN consultaRN = new ConsultaRN();
	private UsuarioRN usuarioRN = new UsuarioRN();
	private DoencaRN doencaRN = new DoencaRN();

	private boolean executarRelatorioConsultasRealizadas = false;;
	private CartesianChartModel categoryModel;
	
	private Usuario medico;
	
	private CartesianChartModel categoryModel2; 
	

	private int totalConsultasRealizadas;
	

	public RelatorioEsperaBean() {
		createCategoryModel2();
	}
	
	
	//Relatorio de consultas realizadas
	private void createCategoryModel() {  
        categoryModel = new CartesianChartModel();  
  
        ChartSeries boys = new ChartSeries();  
        boys.setLabel("Consultas");  
  
        SimpleDateFormat formatter = new SimpleDateFormat("MMM"); 
        totalConsultasRealizadas = 0;

        for(int i=5; i>=0; i--) {
        	GregorianCalendar gc = new GregorianCalendar();
        	gc.add(Calendar.MONTH, -i);
        	int consultasByMonth = consultaRN.getNumConsultasRealizadasByMonth(gc.getTime(), medico);
        	totalConsultasRealizadas += consultasByMonth;
        	
        	boys.set(formatter.format(gc.getTime()) , consultasByMonth);
        }
  
        categoryModel.addSeries(boys);  
    } 
	
	private void createCategoryModel2() {  
		categoryModel2 = new CartesianChartModel();
        SimpleDateFormat formatter = new SimpleDateFormat("MM/yyyy");
        
		List <Doenca> doencas = doencaRN.getList();
		
		
		for(Doenca d : doencas) {
			ChartSeries column = new ChartSeries(); 
			Doenca doenca = doencaRN.getbyNome(d.getNome());
	        List<DiagnosticoConsulta> map = consultaRN.getQtdDoencasDiagnosticadasByMonth(doenca.getIdDoenca());

			
			column.setLabel(d.getNome());
			
			for(int i=5; i>=0; i--) {
				GregorianCalendar gc = new GregorianCalendar();
	        	gc.add(Calendar.MONTH, -i);
	        	String mes = formatter.format(gc.getTime());
	        	int qtde = 0;
	        	for(DiagnosticoConsulta dc :map) {
		        	if(mes.equals(dc.getMes())) {
		        		qtde = dc.getQuantidade();
		        	}
		        
	        	}
        		column.set(mes, qtde);        		

		        	
			}
			
			
			categoryModel2.addSeries(column);
		}
  
		/*
		for() {
			
		}
        ChartSeries series = new ChartSeries();
        series.setLabel("Consultas");  
  
        SimpleDateFormat formatter = new SimpleDateFormat("MMM"); 
        totalConsultasRealizadas = 0;

        for(int i=5; i>=0; i--) {
        	GregorianCalendar gc = new GregorianCalendar();
        	gc.add(Calendar.MONTH, -i);
        	
        	int consultasByMonth = consultaRN.getNumConsultasRealizadasByMonth(gc.getTime());
        	totalConsultasRealizadas += consultasByMonth;
        	
        	boys.set(formatter.format(gc.getTime()) , consultasByMonth);
        }
  
        categoryModel2.addSeries(boys);  
        */
    }  
	/*
	 private void createLinearModel() {  
	        linearModel = new CartesianChartModel();  
	  
	        ChartSeries  series1 = new ChartSeries();  
	        series1.setLabel("Consultas");  
	  
	        SimpleDateFormat formatter = new SimpleDateFormat("MMM"); 
	        int consultasRealizadas = 0;

	        for(int i=0; i<6; i++) {
	        	GregorianCalendar gc = new GregorianCalendar();
	        	gc.add(Calendar.MONTH, -i);
	        	
	        	int consultasByMonth = consultaRN.getNumConsultasRealizadasByMonth(gc.getTime());
	        	consultasRealizadas += consultasByMonth;
	        	
	        	series1.set(formatter.format(gc.getTime()) , consultasByMonth);
	        }
	        this.totalConsultasRealizadas = consultasRealizadas;
	        
	        linearModel.addSeries(series1);  
	    }  
	 */
	
	/*
	 public List<DadoRelatorio> getNascimentos() {
        SimpleDateFormat formatter = new SimpleDateFormat("MMM"); 
        int consultasRealizadas = 0;

        for(int i=0; i<6; i++) {
        	GregorianCalendar gc = new GregorianCalendar();
        	gc.add(Calendar.MONTH, -i);
        	
        	int consultasByMonth = consultaRN.getNumConsultasRealizadasByMonth(gc.getTime());
        	consultasRealizadas += consultasByMonth;
        	
        	nascimentos.add(new DadoRelatorio(formatter.format(gc.getTime()), consultasByMonth) );
        }
        this.totalConsultasRealizadas = consultasRealizadas;
		return nascimentos;
	}
	*/
	

	public int getTotalConsultasRealizadas() {
		return totalConsultasRealizadas;
	}

	public void setTotalConsultasRealizadas(int totalConsultasRealizadas) {
		this.totalConsultasRealizadas = totalConsultasRealizadas;
	}

	public CartesianChartModel getCategoryModel() {
		return categoryModel;
	}

	public void setCategoryModel(CartesianChartModel categoryModel) {
		this.categoryModel = categoryModel;
	}

	public CartesianChartModel getCategoryModel2() {
		return categoryModel2;
	}

	public void setCategoryModel2(CartesianChartModel categoryModel2) {
		this.categoryModel2 = categoryModel2;
	}

	public boolean isExecutarRelatorioConsultasRealizadas() {
		return executarRelatorioConsultasRealizadas;
	}

	public void setExecutarRelatorioConsultasRealizadas(
			boolean executarRelatorioConsultasRealizadas) {
		this.executarRelatorioConsultasRealizadas = executarRelatorioConsultasRealizadas;
	}

	public Usuario getMedico() {
		return medico;
	}

	public void setMedico(Usuario medico) {
		this.medico = medico;
	}
	
	
	public List<SelectItem> getListaMedicos(){
		List<SelectItem> medicos = new ArrayList<SelectItem>();  
        
        for (Usuario u : usuarioRN.getList()) { 
        	if(u.getTipoUsuario().equals(TipoUsuario.MEDICO))
        		medicos.add(new SelectItem(u, u.getNome()));  
        }  
          
        return medicos;	
	}
	
	public String executarRelatorio() {
		setExecutarRelatorioConsultasRealizadas(true);
		createCategoryModel();
		return null;
	}
}
